package com.lcifn.middleware.rpc;

import com.lcifn.middleware.rpc.spi.ServiceSupport;

import java.io.Closeable;
import java.net.URI;
import java.util.List;

/**
 * RPC框架对外提供的服务接口
 * @author lichao
 * @date 2020/12/10 11:47
 */
public interface RpcAccessPoint {

    /**
     * 客户端获取远程服务的引用
     * @param uri 远程服务地址
     * @param serviceClass 远程服务接口Class
     * @param <T> 服务接口类型
     * @return 远程服务引用
     */
    <T> T getRemoteService(URI uri, Class<T> serviceClass);

    /**
     * 服务端注册服务
     * @param serviceClass 服务接口Class
     * @param service 服务实例
     * @param <T> 服务接口类型
     * @return 服务地址
     */
    <T> URI addServiceProvider(Class<T> serviceClass, T service);

    /**
     * 获取注册中心服务实例
     * @param nameServiceUri 注册中心URI
     * @return 注册中心服务实例
     */
    default NameService getNameService(URI nameServiceUri) {
        List<NameService> serviceList = ServiceSupport.loadAll(NameService.class);
        for (NameService service : serviceList) {
            if (service.supportedSchemes().contains(nameServiceUri.getScheme())) {
                service.connect(nameServiceUri);
                return service;
            }
        }
        return null;
    }

    /**
     * RPC服务启动
     * @return
     */
    Closeable startServer() throws Exception;
}
